import fs from 'fs'
import path from 'path'

const mfun = {
	/**
	 * 格式化一个时间戳
	 * @param  {[type]} fmt 格式化方式   说明：
						Y   4位数字年，y为2位数字，如99即1999年
						m   数字月份，有前导0 M无前导0
						d   月份中的第几天，有前导0 D无前导0
						h   24小时格式，有前导0，H无前导0
						g   12小时格式，有前导0，G无前导0
						i   分钟格式，有前导0  I无前导0
						s   秒格式，有前导0  S无前导0
	 * @param  {[type]} s   需要 返回的时间参数  默认fmt
	 * @param  {[type]} tm  使用时间 默认当前时间
	 * @return {[type]}     [description]
	 */
	timef(tm,fmt,allobj){
		if(tm==='now'){ tm=new Date() }
		if(!tm){return ''}
		if (!fmt) { fmt='Y-m-d H:i:s' }
		var t = {       fmt       :        fmt        ||       'Y-m-d H:i:s'       };
		tm    = (isNaN(tm)||tm.constructor==Date)?tm:(parseInt(tm)*1000||new Date());
		if(typeof tm == 'string' && tm.indexOf('T')==-1)
			tm	  = typeof tm == 'string'?tm.replace(/-/g, '/'):tm;//兼容苹果系统处理
		var today=new Date(tm);
		t.time=	today.getTime();
		t.Y   =  today.getFullYear();
		t.y   =  (t.Y+'').slice(-2);
		t.M   =  today.getMonth()+1;
		t.m   =  t.M<10?"0"+t.M:t.M;
		t.D   =  today   .getDate();
		t.d   =  t.D<10?"0"+t.D:t.D;
		t.H   =  today  .getHours();
		t.h   =  t.H<10?"0"+t.H:t.H;
		t.G   =  t.H>12? t.H-12:t.H;
		t.g   =  t.G<10?"0"+t.G:t.G;
		t.I   =  today.getMinutes();
		t.i   =  t.I<10?"0"+t.I:t.I;
		t.S   =  today.getSeconds();
		t.s   =  t.S<10?"0"+t.S:t.S;
		t.K   =  today.getDay();
		t.fmt =  t.fmt.replace(/Y/g,t.Y)
						.replace(/y/g,t.y)
						.replace(/M/g,t.M)
						.replace(/m/g,t.m)
						.replace(/D/g,t.D)
						.replace(/d/g,t.d)
						.replace(/H/g,t.H)
						.replace(/h/g,t.h)
						.replace(/G/g,t.G)
						.replace(/g/g,t.g)
						.replace(/I/g,t.I)
						.replace(/i/g,t.i)
						.replace(/S/g,t.S)
						.replace(/s/g,t.s)
						.replace(/K/g,['日','一','二','三','四','五','六'][t.K]);
		if (!!allobj) {return t; }
		return t.fmt;
	},
	guid() {
		return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
			var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
			return v.toString(16);
		});
	},//guid
	/**
	 * 模型批量加载
	 * @param {*} dirname __dirname 加载模块的基础路径 该路径下除了noLoad列出的文件名都会加载并返回
	 * @param {*} noLoad Array 不加载的文件列表
	 * @returns
	 */
	async loadModal(dirname,noLoad = ['index.js']){
		const files = fs.readdirSync(dirname);
		const modules = {}
		for (let index = 0; index < files.length; index++) {
			const file = files[index];
			const filePath = path.join(dirname, file);
			const stat = fs.statSync(filePath);
			if (stat.isFile() && noLoad.indexOf(file) == -1) {
				try {
					const module = await import(filePath).default;
					const name = module.name.slice(0,1).toUpperCase() +module.name.slice(1)
					modules[name]=module
				} catch (error) {
					console.error(`加载模块失败: ${filePath}`, error);
					throw error;
				}
			}
		}
		return modules
	},
	/**
	 * 批量加载路由
	 * @param {*} dirname __dirname 加载模块的基础路径 该路径下除了noLoad列出的文件名都会加载并返回
	 * @param {*} allowExt Array 允许加载文件的后缀
	 * @param {*} noLoad Array 不加载的文件列表
	 * @param {*} router 路由实例
	 * @param {*} map 路由名映射 如原文件名为test.js或者文件夹为test,（不需要文件后缀）  设置为使用ts访问 {test:'ts'}
	 */
	async loadRouter({router,dirname,allowExt=['js'],noLoad = ['index.js'],map={}}){
		const files = fs.readdirSync(dirname);
		const loadarr = []
		console.log('装载模块列表',files)
		for (let index = 0; index < files.length; index++) {
			const file = files[index];
			let filePath = path.join(dirname, file);
			const stat = fs.statSync(filePath);
			const statHasIndex = !stat.isFile() && fs.existsSync(filePath+'/index.js')
			if(stat.isDirectory() && statHasIndex){
				filePath = path.join(filePath,'index.js')
			}
			const [fileName, ext] = file.split('.')
			const loadThis = stat.isFile() && noLoad.indexOf(file) == -1 && allowExt.indexOf(ext)>=0
			// console.log('加载条件 statHasIndex',statHasIndex ,'loadThis', loadThis,'加载文件',filePath)
			if(statHasIndex || loadThis){
				try {
					// console.log("准备装载",filePath,'file:///'+filePath)
					const moduleLoad = await import('file:///'+filePath);
					const module = moduleLoad.default
					const routerName = map[fileName] || fileName
					console.log('模块加载成功',filePath)//module
					router.use('/'+routerName, module)
					loadarr.push({name:'/'+routerName, module})
					// console.log(filePath,map,fileName,map[fileName],routerName)
				} catch (error) {
					console.error(`加载模块失败: ${filePath}`, error);
					throw error;
				}
			}
		}
		return loadarr
	},
}

export default mfun